#ifndef _GOEM_MODULE_H_
#define _GOEM_MODULE_H_

#include <emacs-module.h>

emacs_env *em_get_environment_forgo (struct emacs_runtime *ert);

emacs_value em_make_global_ref_forgo (emacs_env *env,
                                      emacs_value any_reference);

void em_free_global_ref_forgo (emacs_env *env,
                               emacs_value global_reference);

enum emacs_funcall_exit em_non_local_exit_check_forgo (emacs_env *env) ;

void em_non_local_exit_clear_forgo (emacs_env *env) ;

enum emacs_funcall_exit em_non_local_exit_get_forgo
    (emacs_env *env,
     emacs_value *non_local_exit_symbol_out,
     emacs_value *non_local_exit_data_out);

void em_non_local_exit_signal_forgo (emacs_env *env,
                                     emacs_value non_local_exit_symbol,
                                     emacs_value non_local_exit_data);

void em_non_local_exit_throw_forgo (emacs_env *env,
                                    emacs_value tag,
                                    emacs_value value) ;

#include "cgo_define.h"
extern emacs_value em_function_callback(emacs_env *env, ptrdiff_t nargs,
                                        GoSlice args, void *data);
emacs_value em_function_callback_c(emacs_env *env, ptrdiff_t nargs,
                                   emacs_value args[], void *data);

emacs_value em_make_function_forgo (emacs_env *env,
                                    ptrdiff_t min_arity,
                                    ptrdiff_t max_arity,
                                    emacs_value (*function) (emacs_env *env,
                                                             ptrdiff_t nargs,
                                                             emacs_value args[],
                                                             void *)
                                    EMACS_NOEXCEPT,
                                    const char *documentation,
                                    void *data);

emacs_value em_funcall_forgo (emacs_env *env,
                                     emacs_value function,
                                     ptrdiff_t nargs,
                                     emacs_value args[]);

emacs_value em_intern_forgo (emacs_env *env,
                                    const char *symbol_name) ;

emacs_value em_type_of_forgo (emacs_env *env,
                                     emacs_value value) ;

bool em_is_not_nil_forgo (emacs_env *env, emacs_value value);

emacs_value em_make_float_forgo (emacs_env *env, double value);

emacs_value em_make_string_forgo (emacs_env *env,
                                  const char *contents, ptrdiff_t length);

bool em_eq_forgo (emacs_env *env, emacs_value a, emacs_value b);

intmax_t em_extract_integer_forgo (emacs_env *env, emacs_value value);

double em_extract_float_forgo (emacs_env *env, emacs_value value);

bool em_copy_string_contents_forgo (emacs_env *env,
                                    emacs_value value,
                                    char *buffer,
                                    ptrdiff_t *size_inout);

emacs_value em_vec_get_forgo (emacs_env *env, emacs_value vec, ptrdiff_t i);

void em_vec_set_forgo (emacs_env *env, emacs_value vec, ptrdiff_t i,
                       emacs_value val) ;

ptrdiff_t em_vec_size_forgo (emacs_env *env, emacs_value vec);

emacs_value em_make_integer_forgo (emacs_env *env, intmax_t value);

void set_module_func_pointer(struct emacs_runtime *ert);


#endif

